#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>

#define M 10
#define N 20

sem_t sfork[5];

void Swait(sem_t S_1, sem_t S_2)
{
    /*
    sem_trywait ( sem_t *sem )是函数sem_wait（）的非阻塞版本
    它直接将信号量sem的值减一。在成功完成之后会返回零。其他任何返回值都表示出现了错误。
    */
    while(sem_trywait(&S_1) || sem_trywait(&S_2)); //两个都为0时退出while循环
}

void Ssignal(sem_t S_1, sem_t S_2){
    sem_post(&S_1);
    sem_post(&S_2);
}

void *philosopher (void *p)
{
   int id =(int)p; 
   while(1){
        printf("Thinking...\n");
        Swait(sfork[id], sfork[(id+1)%5]);
         printf("Eating...\n");
        Ssignal (sfork[id], sfork[(id+1)%5]);
    }  
    return NULL;
}

int main(void)
{
    for(int i=0; i<5; i++) 
        sem_init(&sfork[i], 0, 1); 
    pthread_t tid[5];
    for(int i=0; i<5; i++) 
        pthread_create(&tid[i], NULL, philosopher , (void*) i);
    for(int i=0; i<M; i++) 
        sem_destroy(&sfork[i]); 
    pthread_join(tid[0], NULL);
}


